package com.demo.wy.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Calendar;
import java.util.Map;

/**
 * JWT工具类，用于处理JWT令牌的生成、验证和解析
 * JWT(JSON Web Token)由三部分组成：
 * 1. Header（头部）：包含令牌类型和签名算法
 * 2. Payload（负载）：包含声明信息，如用户ID、角色等
 * 3. Signature（签名）：使用密钥对Header和Payload进行签名，确保数据不被篡改
 */
public class JWTUtils {
    // 签名密钥，用于JWT的签名和验证
    private static String SIGNATURE = "token!@#$%^7890";

    /**
     * 生成JWT令牌
     * @param map 传入payload信息，包含需要在JWT中存储的声明信息，如用户ID、用户名等
     * @return 返回生成的JWT令牌字符串
     */
    public static String getToken(Map<String,String> map){
        // 创建JWT构建器
        JWTCreator.Builder builder = JWT.create();
        // 将传入的map中的信息添加到JWT的payload部分
        map.forEach((k,v)->{
            builder.withClaim(k,v);
        });
        // 设置令牌过期时间为7秒后
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.SECOND,7);
        builder.withExpiresAt(instance.getTime());
        // 使用HMAC256算法和密钥进行签名，并返回最终的JWT字符串
        return builder.sign(Algorithm.HMAC256(SIGNATURE));
    }

    /**
     * 验证JWT令牌的有效性
     * 验证过程包括：
     * 1. 验证签名是否正确
     * 2. 验证令牌是否过期
     * 如果验证失败会抛出相应的异常
     * @param token 要验证的JWT令牌
     */
    public static void verify(String token){
        JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
    }

    /**
     * 解析JWT令牌并返回其中的payload信息
     * @param token 要解析的JWT令牌
     * @return 返回解码后的JWT对象，可以通过该对象获取令牌中的声明信息
     */
    public static DecodedJWT getToken(String token){
        return JWT.require(Algorithm.HMAC256(SIGNATURE)).build().verify(token);
    }
}